import type { Metadata } from 'next'; import Link from 'next/link'; import { notFound } from 'next/navigation'; import { DayStrip, LargestGrid, TopEvents, TopLists } from '@/components/history/HistoryViews'; import { Section, Stat } from '@/components/ui/primitives'; import { apiGet } from '@/lib/api'; import { MONTH_NAMES, fmt, fmtInt } from '@/lib/format'; import type { HistorySummary } from '@/lib/types'; export const dynamic = 'force-dynamic'; type Params = Promise<{ year: string; month: string }>; export async function generateMetadata({ params }: { params: Params }): Promise { const { year, month } = await params; const name = MONTH_NAMES[Number(month) - 1] ?? month; return { title: `History ${name} ${year}`, description: `Daily Global Internet Pressure for ${name} ${year} with the largest events and most affected networks.` }; } export default async function HistoryMonthPage({ params }: { params: Params }) { const { year, month } = await params; const y = Number(year); const m = Number(month); if (!/^\d{4}$/.test(year) || !(m >= 1 && m <= 12)) notFound(); const s = await apiGet(`/api/v1/history/summary?year=${y}&month=${m}`); const days = s.days ?? []; const max = days.length ? Math.max(...days.map((d) => d.max)) : null; const min = days.length ? Math.min(...days.map((d) => d.min)) : null; const avg = days.length ? days.reduce((a, d) => a + d.avg, 0) / days.length : null; const events = days.reduce((a, d) => a + d.events, 0); const idx = s.available_months.indexOf(`${year}-${String(m).padStart(2, '0')}`); const prev = idx > 0 ? s.available_months[idx - 1] : null; const next = idx >= 0 && idx < s.available_months.length - 1 ? s.available_months[idx + 1] : null; const toHref = (ym: string) => `/history/${ym.split('-')[0]}/${Number(ym.split('-')[1])}`; return (

History {' '} ·{' '} {year}

{MONTH_NAMES[m - 1]} {year}

{fmt(max)}} />
daily max pressure}>
e.started_at.startsWith(`${year}-${String(m).padStart(2, '0')}`))} />
); }